<?php
namespace tool;


/**
 * 图片类
 * @version 1.0
 *
 * PHP默认只识别application/x-www.form-urlencoded标准的数据类型。
 * 因此，对型如text/xml 或者 soap 或者 application/octet-stream 之类的内容无法解析，如果用$_POST数组来接收就会失败！
 * 故保留原型，交给$GLOBALS['HTTP_RAW_POST_DATA'] 来接收。
 * 另外还有一项 php://input 也可以实现此这个功能
 * php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来，它给内存带来的压力较小，并且不需要任何特殊的 php.ini 设置。php://input和 $HTTP_RAW_POST_DATA 不能用于 enctype="multipart/form-data"。
 */
class imageUpload {
    //上传图片名称
    public $image_name;
    //图片保存名称
    public $save_name;
    //图片访问名称
    public $view_name;
    //图片保存路径
    public $save_dir;
    //目录+图片完整路径
    public $save_fullpath;
    //目录+图片完整访问路径
    public $view_fullpath;
    //图片后缀
    public $mime;
    //错误码
    public $code = 0;
    //错误信息
    public $msg = '成功';
    //图片路径
    public $path = '';

    /**
     * imageUpload constructor.
     */
    public function __construct() {
        //设置保存图片名称，若未设置，则随机产生一个唯一文件名
        $this->save_name = md5 ( time().mt_rand ());
        //设置保存图片路径，若未设置，则使用年/月/日格式进行目录存储
        $second_path = date ( 'Y/m' );
        $this->save_dir = env('IMAGE_SAVE_PATH','./uploads/').$second_path;
        $this->view_dir = env('IMAGE_VIEW_PATH','/uploads/').$second_path;
        //创建文件夹
        @$this->create_dir ( $this->save_dir );
        //设置目录+图片完整路径
        $this->save_fullpath = $this->save_dir. '/' .$this->save_name;
        $this->view_fullpath = $this->view_dir. '/' .$this->save_name;
    }

    /**
     * @param $data
     * @return bool|string 返回图片路径
     */
    public function stream2Image($data) {
        //二进制数据流
//        $data = file_get_contents ( 'php://input' ) ? file_get_contents ( 'php://input' ) : gzuncompress ( $GLOBALS ['HTTP_RAW_POST_DATA'] );
        //数据流不为空，则进行保存操作
        if (! empty ( $data )) {
            //创建并写入数据流，然后保存文件
            if (@$fp = fopen ( $this->save_fullpath, 'w+' )) {
                fwrite ( $fp, $data );
                fclose ( $fp );
//                $baseurl = "http://" . $_SERVER ["SERVER_NAME"] . ":" . $_SERVER ["SERVER_PORT"] . dirname ( $_SERVER ["SCRIPT_NAME"] ) . '/' . $this->save_name;
                if ( $this->getimageInfo ( $this->save_fullpath )) {
                    //重命名文件
                    $path = $this->save_fullpath.'.'.$this->mime;
                    if(rename($this->save_fullpath,$path))
                    {
                        //访问路径
                        $vpath = $this->view_fullpath.'.'.$this->mime;
                        return $vpath;
                    }
                    $this->code = -51;
                    $this->msg = '上传图片失败';
                }
                return false;
            } else {
                $this->code = -52;
                $this->msg = '目录没有写入权限';
                return false;
            }
        } else {
            //没有接收到数据流
            $this->code = -53;
            $this->msg = '没有上传图片';
            return false;
        }
    }
    /**
     * 创建文件夹
     * @param String $dirName 文件夹路径名
     */
    public function create_dir($dirName, $recursive = 1,$mode=0777) {
        ! is_dir ( $dirName ) && mkdir ( $dirName,$mode,$recursive );
    }

    /**
     * @param string $imageName
     * @return bool
     */
    public function getimageInfo($imageName = '') {
        $imageInfo = getimagesize ( $imageName );
        if ($imageInfo !== false) {
            $allow_mime = env('IMAGE_ALLOW_TYPE','png');
            $allow_mime = explode('_',$allow_mime);
            $this->mime = strtolower ( substr ( image_type_to_extension ( $imageInfo [2] ), 1 ) );
            if(!in_array($this->mime,$allow_mime))
            {
                $this->code = -54;
                $this->msg = '类型不允许，只能上传png,jpg,gif格式!';
                return false;
            }
            $imageSize = filesize ( $imageName )/1024;//转换为kb
            if($imageSize>env('IMAGE_MAX_SIZE','1024'))
            {
                $this->code = -55;
                $this->msg = '图片超过最大尺寸，最大允许1M';
                return false;
            }
            //返回文件后缀
            return true;
        } else {
            //不是合法的图片
            $this->code = -56;
            $this->msg = '不是合法的图片';
            return false;
        }
    }
}